#pragma once

#include <typedef.h>
//
#include <task_run.hpp>
#include <utils.hpp>

#if defined(CONFIG_TAR4ESP32)
#include "cmd_system.h"
#include "esp_console.h"
#include "esp_system.h"
#endif

#if !defined(CONFIG_TAR4ESP32)
class ConsoleAutoSaveHistory : public TaskRun
{
public:
	ConsoleAutoSaveHistory();
	virtual ~ConsoleAutoSaveHistory();

protected:
	virtual void Run(void* arg);
};
#endif

class Console : public TaskRun
{
public:
	Console();
	virtual ~Console();
	static Console* Instance(void);
	// 启动线程
	void Start(void* arg = nullptr);

protected:
	virtual void Run(void* arg);

private:
#if defined(CONFIG_TAR4ESP32)
#else
	// 执行命令行
	int ExecCmdLine(std::string line);
	// 加入历史命令
	int AddHistory(std::string line);
	// 载入历史命令
	int LoadHistory(void);
	// 保存历史命令
	int SaveHistory(void);
	// 显示历史命令
	int ShowHistory(void);
	// 从rcS载入自动启动列表
	int ExecFromRcs(void);
	// 从rcT载入自动停止列表
	int ExecFromRct(void);
	// 执行模块主函数
	int Exec(std::vector<char*> args);
	// 分割字符串
	std::vector<char*> SplitCommandLine(const std::string& cmdLine);
#endif

private:
#if defined(CONFIG_TAR4ESP32)
	esp_console_repl_t* m_Repl;
	esp_console_repl_config_t m_ReplConfig;
	esp_console_dev_uart_config_t m_HwUartConfig;
#else
	friend class ConsoleAutoSaveHistory;
	std::list<std::string> m_HisCmds;
	ConsoleAutoSaveHistory m_HisSave;
	bool m_NeedSave;
#endif
};